export class Emitter {
  constructor() {
    this.events = {};
  }

  // 订阅事件，添加监听器
  on(eventName, listener) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(listener);
  }

  // 只触发一次
  once(eventName, listener) {
    const onceWrapper = (...args) => {
      listener(...args); // 执行原监听器
      this.off(eventName, onceWrapper); // 执行后移除
    };
    this.on(eventName, onceWrapper); // 注册包装后的监听器
  }

  // 发布事件，触发所有监听器
  emit(eventName, ...args) {
    if (this.events[eventName]) {
      this.events[eventName].forEach(listener => {
        listener(...args);
      });
    }
  }

  // 取消订阅事件，移除监听器
  off(eventName, listener) {
    if (this.events[eventName]) {
      this.events[eventName] = this.events[eventName].filter(
        l => l !== listener,
      );

      // 如果没有监听器了，则删除该事件
      if (this.events[eventName].length === 0) {
        delete this.events[eventName];
      }
    }
  }
  // 取消订阅事件，移除所有监听器
  remove(eventName) {
    if (this.events[eventName]) {
      delete this.events[eventName];
    }
  }
}
